Versi 1
| Field | Isi |
|---|---|
| Dokumen ID | VBS-PJL-001 |
| Deskripsi | Pencatatan invoice penjualan: daftar dan ringkasan penjualan, pembuatan penjualan biasa maupun dari Sales Order, serta pengelolaan status draft/final invoice |
| Nomor Revisi | 1 |
| Tanggal | 2026-10-04 |
| Keterangan | Dokumentasi baseline dari dokumentasi fitur demo dan kode FE |
1. Ringkasan
a. In scope
- User melihat daftar invoice penjualan beserta tanggal, customer, jatuh tempo, PPN, total, status tagihan, sisa tagihan, keterangan, dan status invoice
- User melihat ringkasan penjualan belum dibayar, penjualan jatuh tempo, dan penjualan terbayar 30 hari terakhir
- User memfilter daftar berdasarkan tanggal invoice, jatuh tempo, customer, barang, cabang, status selesai / belum selesai, status lunas, dan kategori penjualan kasir / grosir
- User membuat penjualan biasa (customer, cabang, lokasi, sales, cluster, tempo, PPN, barang, biaya lain, metode pembayaran) sebagai draft atau final
- User membuat penjualan dari Sales Order yang sudah final dan belum selesai
- User mengubah invoice penjualan yang masih draft
- User melihat detail dan mencetak invoice penjualan
- User mengembalikan invoice final ke draft (unlock), menghapus invoice draft, dan memposting ulang invoice
b. Catatan
c. Kesimpulan
- [FE] -
- [BE] -
2. Functional Requirement
| Kode | Deskripsi |
|---|---|
| FR-01 | Sistem menampilkan daftar invoice penjualan (kasir dan grosir) dengan kolom tanggal, nomor invoice, customer, jatuh tempo, PPN, total penjualan, tagihan, sisa tagihan, keterangan, dan status |
| FR-02 | Sistem menampilkan ringkasan penjualan belum dibayar, jatuh tempo, dan terbayar 30 hari terakhir bagi user yang memiliki hak ringkasan |
| FR-03 | User dapat mencari nomor invoice dan memfilter daftar berdasarkan tanggal invoice, jatuh tempo, customer, barang, cabang, status, lunas, dan kategori kasir / grosir |
| FR-04 | User dapat membuat penjualan biasa lengkap dengan rincian barang, biaya lain, dan metode pembayaran, lalu menyimpan sebagai draft atau final |
| FR-05 | User dapat membuat penjualan berdasarkan Sales Order yang final dan berstatus belum selesai |
| FR-06 | User dapat mengubah invoice penjualan yang masih draft |
| FR-07 | User dapat melihat detail invoice dan mencetak nota sesuai hak cetak draft / cetak ulang |
| FR-08 | User dengan hak draft dapat mengembalikan invoice final menjadi draft |
| FR-09 | User dapat menghapus invoice penjualan yang masih draft |
| FR-10 | User dapat memposting ulang jurnal dan stok sebuah invoice penjualan final |
3. Use Case List
| Kode | Deskripsi |
|---|---|
| UC-01 | Melihat daftar dan ringkasan penjualan |
| UC-02 | Memfilter daftar penjualan |
| UC-03 | Membuat penjualan biasa |
| UC-04 | Membuat penjualan dari Sales Order |
| UC-05 | Mengubah invoice penjualan draft |
| UC-06 | Melihat detail dan mencetak invoice penjualan |
| UC-07 | Membuka kembali (unlock) invoice ke draft |
| UC-08 | Menghapus invoice penjualan draft |
| UC-09 | Memposting ulang invoice penjualan |
4. Use Case Scenario
UC-01 : Melihat daftar dan ringkasan penjualan
| Aktor | User brand dengan hak lihat penjualan |
| Deskripsi | User melihat daftar invoice penjualan dan ringkasan piutang penjualan |
| Prekondisi | User sudah login Brand aktif dipilih |
| Alur utama | 1. User membuka menu Penjualan. 2. Sistem menampilkan ringkasan penjualan belum dibayar, jatuh tempo, dan terbayar 30 hari terakhir. 3. Sistem menampilkan daftar invoice penjualan secara bertahap (infinite scroll). 4. User menggulir untuk memuat halaman berikutnya. |
| Alur negatif | - Jika belum ada data, muncul tampilan "Invoice Penjualan Kosong". - Jika gagal memuat ringkasan, nilai ringkasan ditampilkan 0. |
| Bisnis rule | - Ringkasan hanya tampil untuk user dengan hak #summary-penjualan.- Tanpa hak lihat semua user, daftar dibatasi invoice buatan user itu sendiri ( user_id_create).- User non admin brand hanya melihat invoice di cabang yang diizinkan. - Kolom tagihan dan sisa tagihan hanya terisi untuk invoice final; status Done = final, Draft = belum final. |
| Postkondisi | Daftar dan ringkasan penjualan tampil |
| Trigger | User membuka menu Penjualan |
| Kode FR | FR-01 FR-02 |
UC-02 : Memfilter daftar penjualan
| Aktor | User brand dengan hak lihat penjualan |
| Deskripsi | User mempersempit daftar invoice penjualan dengan pencarian dan filter |
| Prekondisi | Halaman daftar penjualan terbuka |
| Alur utama | 1. User mengetik nomor invoice atau membuka panel Filter. 2. User memilih periode tanggal invoice, periode jatuh tempo, customer, barang, cabang, status, lunas, dan/atau kategori penjualan. 3. Sistem memuat ulang daftar sesuai filter. 4. Filter aktif ditampilkan di atas tabel. |
| Alur negatif | - Jika tidak ada data yang cocok, muncul tampilan daftar kosong. - Tombol Reset mengosongkan seluruh filter. |
| Bisnis rule | - Kategori penjualan: kasir (invoice dari Penjualan Kasir) atau grosir (invoice dari form penjualan). - Status: selesai = final, belum selesai = draft. - Pilihan barang hanya barang yang dapat dijual. |
| Postkondisi | Daftar tampil sesuai filter |
| Trigger | User mengubah pencarian atau filter |
| Kode FR | FR-03 |
UC-03 : Membuat penjualan biasa
| Aktor | User dengan hak tambah penjualan |
| Deskripsi | User membuat invoice penjualan baru tanpa Sales Order |
| Prekondisi | User memiliki hak #penjualan basicKuota invoice paket belum habis |
| Alur utama | 1. User klik Buat Invoice lalu pilih Penjualan. 2. User mengisi tanggal, customer, cabang, lokasi, sales, cluster, tempo pembayaran, PPN keluaran, nomor faktur pajak, mode PPN, status barang dikirim dan tanggal kirim, serta keterangan. 3. User menambah baris barang (barang, satuan, qty, harga, diskon). 4. User menambah biaya lain-lain (opsional). 5. User mengisi metode pembayaran. 6. User klik Simpan Draft atau Simpan Final, lalu mengonfirmasi untuk final. 7. Sistem membuat invoice penjualan dan kembali ke daftar. |
| Alur negatif | - Jika form belum valid, muncul "Tolong lengkapi form dengan benar!". - Jika cabang kosong, muncul "Tolong lengkapi gudang form dengan benar!". - Jika final tanpa customer dan tanpa hak customer kosong, muncul "Customer harus diisi". - Jika total 0 tanpa hak jual total 0, muncul "Total penjualan tidak boleh 0". - Jika tempo 0 dan final tanpa metode pembayaran, muncul "Untuk penjualan tempo 0, metode pembayaran harus diisi". - Jika customer melewati batas jumlah nota / piutang, muncul peringatan "Customer Tersebut telah mencapai batas ...". - Jika tempo 0 dan pembayaran melebihi total, muncul "Pembayaran tidak boleh melebihi Nilai Total Pembayaran". - Jika tempo lebih dari 0 tanpa customer, muncul "Tempo harus 0 untuk penjualan tanpa customer". - Jika kuota paket habis, muncul "Data Penjualan anda melebihi limit ...". |
| Bisnis rule | - Penjualan tempo 0 wajib metode pembayaran saat final; tempo lebih dari 0 menghasilkan piutang. - Pemakaian titipan DP dengan tempo 0 otomatis mengubah tempo menjadi 1. - Batas nota / piutang customer dapat dilewati hanya dengan hak #overrule-limit-piutangnota.- Barang grup otomatis menambah baris komponennya. - Mode multi cabang mewajibkan cabang per baris. |
| Postkondisi | Invoice penjualan tersimpan sebagai draft atau final |
| Trigger | User klik Simpan Draft / Simpan Final |
| Kode FR | FR-04 |
UC-04 : Membuat penjualan dari Sales Order
| Aktor | User dengan hak penjualan dari Sales Order |
| Deskripsi | User membuat invoice penjualan dengan dasar Sales Order |
| Prekondisi | Ada Sales Order final dengan status belum selesai User memiliki hak #so-stok-cukup |
| Alur utama | 1. User klik Buat Invoice lalu pilih Penjualan dari Sales Order, atau memilih "Masukkan Penjualan atas SO ini" dari Sales Order. 2. User memilih customer dan cabang, lalu memilih Sales Order (atau SO terisi otomatis dari tautan). 3. Sistem mengisi cabang, customer, sales, keterangan, dan rincian barang dari SO. 4. User menyesuaikan qty, melengkapi pembayaran. 5. User menyimpan draft atau final. 6. Sistem membuat invoice penjualan yang terhubung ke SO. |
| Alur negatif | - Jika form belum valid, muncul "Tolong lengkapi form dengan benar!". - Jika metode pembayaran wajib tetapi kosong, muncul "Metode Pembayaran Harus Diisi". - Validasi customer, total 0, batas nota / piutang, dan kelebihan pembayaran sama seperti penjualan biasa. |
| Bisnis rule | - SO yang dapat dipilih hanya SO final dengan status belum selesai untuk customer dan cabang terpilih. - Metode pembayaran baru dipilih di invoice penjualan, bukan di SO. - Cabang dan baris barang (barang, SKU, satuan) wajib saat simpan. |
| Postkondisi | Invoice penjualan tersimpan dan tercatat sebagai realisasi SO |
| Trigger | User klik Penjualan dari Sales Order |
| Kode FR | FR-05 |
UC-05 : Mengubah invoice penjualan draft
| Aktor | User dengan hak tambah penjualan |
| Deskripsi | User memperbarui invoice penjualan yang masih draft |
| Prekondisi | Invoice berstatus draft |
| Alur utama | 1. User memilih Edit pada invoice draft. 2. Sistem memuat data invoice. 3. User mengubah data header, barang, biaya, atau pembayaran. 4. User menyimpan draft atau final. 5. Sistem memperbarui invoice. |
| Alur negatif | - Jika user memiliki batasan hari ini dan tanggal invoice bukan hari ini, muncul "Anda tidak bisa merubah Invoice Penjualan yang tidak sama dengan hari ini!". - Validasi form sama seperti pembuatan penjualan. |
| Bisnis rule | - Menu Edit hanya tersedia untuk invoice draft. - Batasan edit hari ini berlaku untuk hak #limit-create-today dan bukan admin brand. |
| Postkondisi | Invoice penjualan terbarui |
| Trigger | User klik Edit lalu Simpan |
| Kode FR | FR-06 |
UC-06 : Melihat detail dan mencetak invoice penjualan
| Aktor | User dengan hak lihat / cetak penjualan |
| Deskripsi | User membuka detail invoice dan mencetak nota |
| Prekondisi | Invoice tersedia |
| Alur utama | 1. User memilih Lihat pada invoice. 2. Sistem menampilkan informasi, rincian barang, biaya lain, dan rincian pembayaran. 3. User klik Cetak. 4. Sistem menandai invoice sudah dicetak lalu menampilkan pilihan layout cetak. |
| Alur negatif | - Jika gagal mengambil data, muncul pesan error dari sistem. |
| Bisnis rule | - Cetak draft hanya untuk hak #cetak-draft-penjualan.- Cetak ulang invoice final mengikuti hak reprint dan riwayat cetak. |
| Postkondisi | Nota tercetak dan riwayat cetak tercatat |
| Trigger | User klik Lihat / Cetak |
| Kode FR | FR-07 |
UC-07 : Membuka kembali (unlock) invoice ke draft
| Aktor | User dengan hak draft penjualan |
| Deskripsi | User mengubah invoice final kembali menjadi draft agar dapat diedit |
| Prekondisi | Invoice berstatus final |
| Alur utama | 1. User memilih "Ubah ke Simpan Draft". 2. Sistem mengubah invoice menjadi draft. 3. Sistem menampilkan "Berhasil Ubah ke Simpan Draft Invoice ...". |
| Alur negatif | - Jika ditolak sistem (misal sudah ada pembayaran / periode terkunci), muncul pesan error dari sistem. |
| Bisnis rule | - Hanya untuk user dengan hak #can-draft dan hak draft pada #penjualan. |
| Postkondisi | Invoice berstatus draft |
| Trigger | User klik Ubah ke Simpan Draft |
| Kode FR | FR-08 |
UC-08 : Menghapus invoice penjualan draft
| Aktor | User dengan hak tambah penjualan |
| Deskripsi | User menghapus invoice penjualan yang belum final |
| Prekondisi | Invoice berstatus draft |
| Alur utama | 1. User memilih Hapus pada invoice draft. 2. Sistem menghapus invoice. 3. Sistem menampilkan "Berhasil Hapus Invoice ..." dan menghapus baris dari daftar. |
| Alur negatif | - Jika gagal, muncul pesan error dari sistem. |
| Bisnis rule | - Menu Hapus hanya tersedia untuk invoice draft. |
| Postkondisi | Invoice terhapus |
| Trigger | User klik Hapus |
| Kode FR | FR-09 |
UC-09 : Memposting ulang invoice penjualan
| Aktor | User dengan hak penjualan |
| Deskripsi | User meminta sistem menghitung ulang jurnal dan stok invoice final |
| Prekondisi | Invoice berstatus final |
| Alur utama | 1. User memilih Posting Ulang. 2. Sistem memproses ulang integritas invoice. 3. Sistem menampilkan "Berhasil Memposting Ulang Penjualan dengan no invoice ...". |
| Alur negatif | - Jika gagal, muncul pesan error dari sistem. |
| Bisnis rule | - Posting ulang dikirim dengan penanda proses ulang integritas untuk invoice terpilih. |
| Postkondisi | Jurnal dan stok invoice diproses ulang |
| Trigger | User klik Posting Ulang |
| Kode FR | FR-10 |
5. Data Flow Diagram
DFD-01
6. Sequence Diagram
SD-01 — UC-01 : Melihat daftar dan ringkasan penjualan
SD-02 — UC-02 : Memfilter daftar penjualan
SD-03 — UC-03 : Membuat penjualan biasa
SD-04 — UC-04 : Membuat penjualan dari Sales Order
SD-05 — UC-05 : Mengubah invoice penjualan draft
SD-06 — UC-06 : Melihat detail dan mencetak invoice penjualan
SD-07 — UC-07 : Membuka kembali (unlock) invoice ke draft
SD-08 — UC-08 : Menghapus invoice penjualan draft
SD-09 — UC-09 : Memposting ulang invoice penjualan
7. Table Schema
8. API Schema
| Endpoint | Status | Perubahan |
|---|---|---|
GET /invoice-penjualan | existing | - |
GET /invoice-penjualan/:id | existing | - |
PUT /invoice-penjualan/invoice-only/:id | existing | - |
PUT /invoice-penjualan/unlock/:id | existing | - |
DELETE /invoice-penjualan/:id | existing | - |
POST /penjualan | existing | - |
PUT /penjualan/:id | existing | - |
GET /invoice-so | existing | - |
GET /invoice-so/:id | existing | - |
POST /integrity/sync-satuan-bulk | existing | - |
GET /customer | existing | - |
POST /financial-report/invoice-piutang-report | existing | - |
POST /financial-report/invoice-bayar-piutang-report | existing | - |
POST /laporan-penjualan/sales-report | existing | - |